package com.ifonly.datatables.sql;

import com.ifonly.logger.Logger;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * . SQL语句封装接口
 * </p>
 *
 * @author Jerry Ou
 * @version 1.0 2015-08-31 22:55
 * @since JDK 1.6
 */
public abstract class DTSql {
    protected final Logger LOGGER = Logger.getLogger(DTSql.class);

    protected static String SELECT = "SELECT";
    protected static String AS = "AS";
    protected static String WHERE = "WHERE";
    protected static String AND = "AND";
    protected static String LIKE = "LIKE";
    protected static String OR = "OR";
    protected static String ORDER_BY = "ORDER BY";

    /**
     * 初始化方法，用于初始化 SQL 子句，以及查询条件封装
     *
     *  segment --> 初始化时候需要传入的查询表 SQL 片段
     *          如 FROM user
     *
     * @param segment 查询表 SQL 片段
     * @param keyword 当segment SQL 中包含where的时候，最终生成sql时候第一个关键字
     * @return 封装的SQL对象
     */
    public abstract DTSql init(String segment, String keyword);

    /**
     * 获取生成好的SQL语句
     *
     *  对应是否采用原始，生成的SQL语句不一样
     *
     *  是原始
     *      SELECT id, name FROM user WHERE name LIKE ?
     *
     *  非原始
     *      SELECT id, name FROM user WHERE name LIKE #{name}
     *
     * @return SQL语句
     */
    public abstract String getSql();

    /**
     * 原始sql时候，使用的参数列表
     *
     *   如：
     *      SELECT id, name FROM user WHERE name LIKE ?
     *   返回一个列表
     *      {%name_val%}
     *
     * @return 参数
     */
    public abstract List<Object> getParams();

    /**
     * 非原始sql时候，使用的参数列表
     *
     *   如：
     *      SELECT id, name FROM user WHERE name LIKE #{name}
     *   返回一个列表
     *      {name = %name_val%}
     */
    public abstract Map<String, Object> getParamValue();

    /**
     * 是否使用的原始SQL
     *
     * @return true 是原始SQL
     */
    public abstract boolean isOriginal();

}
